define(function(require, exports){
	var $ = require("jquery");
	var util = require('util');
	var pubjs = require('pubjs');
	var view  = require('@base/view');
	var common = require('modules/common');
	var addQualification = require('plan/popwin/addQualification').base;
	var rvd = pubjs.config('RAIDO_VALUE_DEFINE');



	var CLIENT_TYPE = {
		'PC': 1,
		'MOBILE_WAP': 2,
		'MOBILE_APP': 3
	}

	// 活动编辑基础模块
	var Base = view.widget.extend({
		init:function(config) {
			//是否有保存活动的权限
			config = pubjs.conf(config, {
				'class': 'P-campaignEdit',
				'tplFile':	'/tpl/plan/edit.tpl',
				'url':
				{
					'info': 'plan/info',
					'add': 'plan/add',
					'update': 'plan/update',
					'draft': 'plan/draft'
				},
				vModel:
				{
					'_frequencyRadio': rvd.ALL,
					// 日程设置radio
					'_TimeSetRadio': rvd.ALL,
					// 投放地区radio
					'_ZoneRadio': rvd.ALL,
					// 三方检测radio
					'_MonitorRadio': rvd.ALL,
					// 素材组radio
					'_MaterialGroupRadio': rvd.ALL,

					// 终端类型
					'Clients': CLIENT_TYPE.PC,
					// 展示监测
					'ImpressionMonitor': '',
					// 点击监测
					'ClickMonitor': '',

					// placeholder类型
					monitorPlaceholder: LANG('请输入监控的第三方调用的 URL 地址，暂不支持互众和腾讯渠道，多个 URL 地址请用回车换行隔开'),


					evLoadFrom: this.eventLoadFromSelect,
					// 查看宏定义
					evMacro: this.eventMacro,
					// 添加资质
					evAddQualification: this.evAddQualification.bind(this),


					isPopwin: false,
					Status: 1,
					showSaveAndAdd: (pubjs.checkRight('plan.add,plan.update')) && (pubjs.checkRight('campaign.add'))
				},
				'layout': {
					'module': view.container,
					'step':false
				}
			});

			this.Super('init', arguments);
		}
		,afterBuild:function() {
			var self = this;
			var c = self.getConfig();
			var el = self.getDOM();
			if (c.title) {
				self.setTitle(c.title);
			}
			if(c.layout.step) {
				el.prepend("<div pub-name='step' pub-mod='layout/navStep.base'></div>")
			}
			this.vm.$.text = 'aaa';
			self.buildFromTemplate({
				name: {
					width: 300,
					value: LANG('新建计划_%1', util.date('YmdHis')),
					placeholder:"不超过50个字符"
				},
				custom_id: {
					width: 300
				},
				'advertiser': {
					'type': 'button',
					'url': 'qualification/owns',
					'name': 'Name',
					'key': '_id',
					'reqType': 'websocket',
					'all': true,
					'width': 300,
					// 'def': '',
					'param': {

					},
					'def': LANG('选择广告主'),
					'panel_config': {
						'hasSearch': true,
						'height': 200
					}
				},
				// 投放日期开始
				startTime: {
					value: util.date('Y-m-d'),
					buttons: null
				},
				// 投放结束日期
				endTime: {
					min: util.date('Y-m-d'),
					showDialogButton: true
				},
				tag: {
					'database': 'plan/labels',
					'async': true,
					'tips': LANG('给计划贴上标签，方便管理。多个标签用“,”分开。')
				},
				save: {
					'value': LANG('保存'),
					'class': 'btn btn-default mr10'
				},
				cancel: {
					'value': LANG('取消'),
					'class': 'btn btn-default mr10'
				},
				draft: {
					'value': LANG('保存草稿'),
					'class': 'btn btn-default mr10'
				},
				saveAndAdd: {
					'value': LANG('保存并下一步'),
					'class': 'btn btn-confirm mr10',
					'width': 150
				},

				// 日程设置
				timeSetTip: {
					width: 300,
					data: LANG('设置活动的推广时间。')
				},
				nameTip: {
					width: 300,
					data: LANG('可直接将已有的设置相似的计划导入该计划中')
				},
				frequencyTip: {
					width: 300,
					data: LANG('控制在设定的时间内活动或创意包的展现次数。“0”表示不限次数。多个条件控制的情况，只要满足任意一个条件则暂停对应创意包或活动的投放。')
				},
				materialGroup: {
					canImport: true,
					canSave: true
				},
				totalLimitTip: {
					width: 300,
					data: LANG('计划总预算，“0”表示不限;<br/>计划的总预算设置，达到预算上限时计划进入超预算状态;')
				},
				dailyLimitTip: {
					width: 300,
					data: LANG('投放期间计划每日预算，“0”表示不限;<br/>计划的每日预算设置，达到预算上限时计划进入超预算状态;')
				},
				step:{
					data:[
						{'name':'plan','title':LANG('新建计划'),'class':'having'},
						{'name':'campaign','title':LANG('新建推广组'),'class':''}
					]
				}
			});

			self.createAsync('selectPlan', 'plan/popwin/selectPlan.main');
			self.createAsync('addActivity', 'plan/popwin/selectPlan.addActivity');
		},
		afterBuildTemplate: function() {
			this.updateAdvertiser();
		},
		updateAdvertiser: function(){
			var aderId = util.getQueryString('aderId');
			var advertiser = this.get('advertiser');
			if(aderId && advertiser && !self.$id){
				advertiser.setValue(aderId);
			}else{
				advertiser.reset();
			}
			return this;
		},
		setParam: function(id) {
			var self = this;
			self.$isEdit = true;
			self.$id = +id;
			util.each(self.$stepCaches, function (step) {
				var mod = self.get(step.name);
				if (mod) {
					if (mod.setParam) {
						mod.setParam(id);
					}
				}
			});
			return self;
		},
		setIsEdit: function(boolen){
			this.$isEdit = !!boolen;
			return this;
		},
		load: function(id, isCopy) {
			var self = this;
			pubjs.loading.show();
			var c = self.getConfig();
			if(id)
			{
				if(!isCopy)
				{
					self.$isEdit = true;
					self.$id = +id;
				}
			}

			pubjs.mc.send(c.url.info, {_id: +id}, self.onData.bind(self), isCopy);
			return self;
		},
		onData: function(err, data, isCopy) {
			pubjs.loading.hide();
			if(err) {
				return pubjs.alert(err.message);
			}

			// 复制需要删除ID
			if (isCopy)
			{
				data.$copyId = data._id;
				data._id = null;
				this.$id = null;
				this.$isEdit = false;
			}

			this.setData(data);
		},
		setData: function(data) {
			var self = this;
			var cs = self.$;
			var vm = self.vm.$data;
			this.$data = data;
			var c = self.getConfig();
			// 编辑状态下不可修改资质。
			if (data._id){

			}
			// 资质
			if(data.AdvertiserId){
				cs.advertiser.setValue(data.AdvertiserId).disable();
			}

			// 自定义id
			cs.custom_id.setValue(data.CustomId || '');

			// 计划状态
			vm.Status = data.Status == 2 ? 2 : 1;
			// 投放日期
			var startTime = data.StartTime || util.date('Y-m-d');
			var endTime = data.EndTime;
			if (startTime)
			{
				cs.startTime.setData(startTime);
			}
			if(endTime)
			{
				cs.endTime.setData(endTime);
			}

			// 频次控制
			var frequency = data.FrequencyFilters || [];
			vm._frequencyRadio = frequency.length ? rvd.NOT_ALL: rvd.ALL;
			cs.frequency.setData(frequency);


			// 计划标签
			cs.tag.setData(data.Label);

			// 计划上限
			cs.totalLimit.setData(data.TotalLimit);
			cs.dailyLimit.setData(data.DailyLimit);
			// 名字
			cs.name.setValue(data.Name);

			// 日程设置
			var timeSet = data.TimeSet || {};
			// 后端会返回Type，Type值为1时为全天候展示广告
			vm._TimeSetRadio = timeSet.Type !== 1 ? rvd.NOT_ALL: rvd.ALL;
			cs.timeset.setData(timeSet.DayHour);

			// 投放终端
			if(util.isArray(data.Clients)){
				vm.Clients = data.Clients[0];
			}else{
				vm.Clients = data.Clients;
			}

			// 投放地区
			var zone = data.Zone || [];
			vm._ZoneRadio = zone.length ? rvd.NOT_ALL: rvd.ALL;
			cs.zone.setData(zone);

			// 智能监控
			cs.campaignMonitor.setData(data.Monitor);

			// 三方监测
			var ThirdMonitor = data.ThirdMonitor || {};
			if (ThirdMonitor.Status)
			{
				vm._MonitorRadio = 0;
				vm.ImpressionMonitor = (ThirdMonitor.Exposure || []).join('\n');
				vm.ClickMonitor = (ThirdMonitor.Click || []).join('\n');
			}

			if(data.hasOwnProperty('MaterialGroup'))
			{
				vm._MaterialGroupRadio = rvd.NOT_ALL;
				cs.materialGroup.setData(data.MaterialGroup);
			}

			return self;
		},
		getData: function() {
			var data = {};
			var self = this;
			var vm = self.vm.$data;
			var cs = self.$;
			var vmGet = self.vm.getCopy.bind(this.vm);
			// 资质
			data.AdvertiserId = +cs.advertiser.getValue(true).id || '';

			// 活动状态
			data.Status = +vmGet('Status');
			// 名称
			data.Name = cs.name.getValue() || '';
			if(data.Name && data.Name.trim)
			{
				data.Name = data.Name.trim();
			}
			// 自定义id
			data.CustomId = cs.custom_id.getValue() || '';
			if(data.CustomId && data.CustomId.trim)
			{
				data.CustomId = data.CustomId.trim();
			}

			if(vmGet('_frequencyRadio') != rvd.ALL)
			{
				data.FrequencyFilters = cs.frequency.getData();
			}

			data.Label = cs.tag.getData();
			data.StartTime = cs.startTime.getData();
			data.EndTime = cs.endTime.getData() || 0;
			data.TotalLimit = cs.totalLimit.getData();
			data.DailyLimit = cs.dailyLimit.getData();

			// 日程设置
			data.TimeSet = {
				Type: vmGet('_TimeSetRadio') != rvd.ALL ? 2: 1,   // 1为全天投放，2为指定时间
				DayHour: cs.timeset.getData()
			};

			// 投放地区
			if (vmGet('_ZoneRadio') != rvd.ALL) {
				data.Zone = cs.zone.getData() || [];
			}

			// 投放终端
			data.Clients = [+vmGet('Clients')];

			// 三方检测
			if(vmGet('_MonitorRadio') != rvd.ALL)
			{
				data.ThirdMonitor = {
					'Status': 1
				};
				data.ThirdMonitor.Exposure = util.trim(vmGet('ImpressionMonitor')).replace(/\r/g, '\n').split('\n');
				data.ThirdMonitor.Click = util.trim(vmGet('ClickMonitor')).replace(/\r/g, '\n').split('\n');
			}
			else
			{
				data.ThirdMonitor = {
					'Status': 0,
					'Exposure': [],
					'Click': []
				};
			}

			// 智能监控
			// 智能监控状态 0:关闭 1:引用监控设置
			data.Monitor = cs.campaignMonitor.getData();

			if(vmGet('_MaterialGroupRadio') != rvd.ALL)
			{
				data.MaterialGroup = cs.materialGroup.getData();
			}

			return data;
		},
		// 验证
		validate: function(data, isDraft, cb) {
			if(isDraft)
			{
				return cb();
			}

			var re_decimals = /[\.-]/ig; // 检测小数
			var self = this;
			var cs = self.$;
			data = data || self.getData();
			if(data)
			{
				if(!data.AdvertiserId){
					pubjs.alert(LANG('请设置广告主'));
					return false;
				}
				if(!data.Name)
				{
					pubjs.alert(LANG('请设置该计划的名称'));
					return false;
				}
				if(data.Name && data.Name.length>=50){
					pubjs.alert(LANG('计划名称不得超过 50 个字符'));
					return false;
				}
				if(data.StartTime === '')
				{
					pubjs.alert(LANG('请设置一个计划开始日期'));
					return false;
				}

				// 检查开始结束时间是否符合要求
				if(!this.checkTime())
				{
					return false;
				}

				// 频次控制验证
				var frequencyFilters = data.FrequencyFilters;
				if(frequencyFilters && frequencyFilters.length)
				{
					var tempFrequencyFlag = false;
					util.each(frequencyFilters, function(item)
					{
						var frequency_value = +item.Frequency;
						if(re_decimals.test(frequency_value) || !util.isNumber(frequency_value))
						{
							tempFrequencyFlag = true;
						}
					});

					if(tempFrequencyFlag)
					{
						pubjs.alert(LANG('频次控制次数为大于等于0的整数'));
						return false;
					}
				}

				if(cs.totalLimit.validate)
				{
					if(!cs.totalLimit.validate(data.TotalLimit))
					{
						return false;
					}
				}

				if(cs.dailyLimit.validate)
				{
					if(!cs.dailyLimit.validate(data.DailyLimit))
					{
						return false;
					}
				}

				// 这个一定要放最后，是异步的
				if(data.hasOwnProperty('MaterialGroup'))
				{
					return cs.materialGroup.doSave({Strategy: data.MaterialGroup}, function (forceUpdate) {
						if(forceUpdate)
						{
							data.MaterialGroupForce = true;
						}

						cb();
					});
				}

				return cb();
			}
			else
			{
				pubjs.alert(LANG('数据错误'));
				return false;
			}
		},
		onInputClick: function(ev)
		{
			switch (ev.name)
			{

				case 'save':
					return this.save();
				case 'cancel':
					return this.cancel();
				case 'draft':
					return this.saveDraft();
				case 'saveAndAdd':
					return this.saveAndAdd();
			}
		},
		cancel: function() {
			pubjs.controller.navigate(-1);
		},
		save: function(draft, add) {
			var url;
			var self = this;
			var data = self.getData();
			var c    = self.getConfig('url');

			data['__TID__'] = Date.now();

			self.validate(data, draft, function () {
				if(self.$isEdit && self.$id)
				{
					data._id = self.$id;
				}

				if (draft)
				{
					url = c.draft;
				}
				else if (data._id)
				{
					url = c.update;
				}
				else
				{
					url = c.add;
				}

				pubjs.loading.show();
				if (add) {
					pubjs.mc.send(url, data, self.afterSaveAndAdd.bind(self));
				}
				else {
					pubjs.mc.send(url, data, self.afterSave.bind(self));
				}
			});
		},
		saveDraft: function() {
			var self = this;
			pubjs.confirm(LANG('保存为草稿后活动将暂停投放。确定保存为草稿吗？'), function(isOk){
				if(isOk){
					self.save(true);
				}
			});
		},
		afterSave: function(err, data) {
			pubjs.loading.hide();
			if (err){
				pubjs.alert(err.message);
				return false;
			}

			this.$data = data;

			if (common.checkOpener() && window.opener && window.opener.pubjs)
			{
				window.opener.pubjs.core.cast('savePlanSuccess', {"id": data._id});
			}

			this.cancel();
		},
		eventLoadFromSelect: function() {
			this.$.selectPlan.show();
		},
		// 现有活动复制消息
		onSelectPlan: function(ev) {
			this.$.selectPlan.hide();
			var self = this;
			pubjs.confirm(LANG('确认要复制选中的计划内容吗? 当前的计划修改信息将会丢失.'), function(isOk) {
				if(isOk)
				{
					self.$copyId = ev.param._id;
					self.load(ev.param._id, true);
				}
			});

			return false;
		},
		onDateChange: function(ev)
		{
			var name = ev.name;
			// 如果开始结束时间变化时，检查选择的时间是否符合规格
			if ((name == "startTime") || (name == "endTime"))
			{
				var cs = this.$;
				switch (ev.from){
					case cs.startTime:
						cs.endTime.setup({min: ev.param});
						break;
					case cs.endTime:
						cs.startTime.setup({max: ev.param});
						break;
				}
			}
		},
		// 要求：当结束时间不为0时，开始时间 <= 结束时间
		checkTime: function()
		{
			var start = this.$.startTime.getData(true);
			var end = this.$.endTime.getData(true) || 0;

			// end 不等于0的时候,同时开始时间大于结束时间
			if ((end != 0) && (start > end))
			{
				pubjs.alert(LANG('计划开始时间不能小于结束时间'));
				return false;
			}

			return true;
		},
		saveAndAdd: function(){
			this.save(false, true);
			return false;
		},
		afterSaveAndAdd: function(err, data){
			pubjs.loading.hide();
			if (err) {
				pubjs.alert(err.message);
				return false;
			}

			this.$data = data;

			if (common.checkOpener() && window.opener && window.opener.pubjs)
			{
				window.opener.pubjs.core.cast('savePlanSuccess', {"id": data._id});
			}

			pubjs.controller.navigate('serving/campaignEdit?planId=' + data._id);

			// 新建活动弹窗
			// this.$.addActivity.show().setParam({id: +data._id});
		},
		eventMacro: function(ev){
			var elm = ev.target;
			var desc = '<p目前支持以下的宏：</p><p>{adxid} 渠道 ID，例如是 Tanx 还是百度</p><p>{campaignid} 推广组 ID</p><p>{spotid} 广告位 ID</p><p>{width} 广告位宽度</p><p>{height} 广告位高度</p><p>{ctpid} 创意包 ID</p><p>{ldpid} 落地页 ID</p><p>{refh} 来源域名</p>';
			var tip = this.get('macroTip');
			if(!tip){
				this.createAsync('macroTip', '@base/tip.base', {
					anchor: $(elm),
					width: 300,
					height: 200,
					pos: 'mr',
					offsetY: 60,
					offsetX: 10,
					hasArrow: false,
					autoHide: 'click'
				},function(mod){
					if(mod){
						mod.setData(desc);
					}
				});
			}else{
				tip.show();
				tip.setData(desc);
			}
		},
		evAddQualification: function()
		{
			//todo 弹窗添加资质, 弹窗里面的功能还没完善。
			var mod = this.$.addQualification;
			if (!mod)
			{
				mod = this.create('addQualification', addQualification);
			}
			mod.reset().show();
		},
		reset: function() {
			this.Super('reset', arguments);
			this.$id = null;
			this.$isEdit = null;
			this.$.name.setValue(LANG('新建计划_%1', util.date('YmdHis')));
			this.$.advertiser.reset().load().enable();
			this.updateAdvertiser();
			this.vm.reset();
			return this;
		},
		onGetStep: function (data) {
		}
	});

	exports.base = Base;

	var Popwin = Base.extend({
		init: function(config) {
			config = pubjs.conf(config, {
				isPopwin: true,
				// 白名单为1，黑名单为2
				WhiteBlackType: 1,
				readonly: {},
				view_model: {
					isPopwin: true
				},
				layout:  {
					module: '@base/dialog.base',
					silence: false,
					title: LANG('新建计划'),
					size: 'l',
					height: 750
				}
			});

			this.Super('init', arguments);
		}
		,setTitle: function(title) {
			return this.getLayout().setTitle(title);
		}
		,afterBuild: function() {
			this.Super('afterBuild', arguments);
			// 加滚动条
			this.getContainer().css('overflow', 'scroll');
		}
		,onDialogOk: function() {
			this.save();
			return false;
		}
		,afterSave: function(err, data) {
			pubjs.loading.hide();
			if (err){
				pubjs.alert(err.message);
				return false;
			}

			this.hide();
			this.fire('newPlanDone', data);
		}
	});

	exports.popwin = Popwin;
});